package com.tools.pojo.workflow.po;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.tools.common.model.BaseEntity;
import com.tools.pojo.workflow.bo.StepContext;
import com.tools.utils.JsonUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.annotation.Transient;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * 流程实例表
 */
@Getter
@Setter
@Slf4j
@TableName("flow_instance")
public class FlowInstance extends BaseEntity {
    /**
     * 流程定义ID
     */
    private Long flowDefinitionId;
    /**
     * 业务键
     */
    private String businessKey;

    /**
     * 当前执行的节点编码（包括所有类型的节点：START、STEP、CONDITION、END等）
     */
    private String currentNodeCode;
    /**
     * 当前步骤
     */
    private String currentStepCode;
    /**
     * 状态
     */
    private Integer status;
    /**
     * 上下文数据
     */
    private String contextData; // JSON格式的上下文数据

     /**
     * 执行路径（记录已执行的节点编码，逗号分隔）
     */
    private String executionPath;
    
    /**
     * 流程开始时间
     */
    private LocalDateTime startTime;
    
    /**
     * 流程结束时间
     */
    private LocalDateTime endTime;
    
    /**
     * 流程总耗时（毫秒）
     */
    private Long executionDuration;
    
    /**
     * 流程定义版本（记录流程实例使用的流程定义版本）
     */
    private Integer flowDefinitionVersion;

    @Transient  // 表示非持久化字段
    @TableField(exist = false)
    private StepContext sharedContext;

    // 新增上下文数据解析方法
    public Map<String, Object> parseContextData() {
        if (StringUtils.isBlank(this.contextData)) {
            return new HashMap<>();
        }

        try {
            return JsonUtil.fromJson(this.contextData, new TypeReference<>() {
            });
        } catch (JsonProcessingException e) {
            log.error("解析上下文数据失败，流程实例ID: {}", this.getId(), e);
            return new HashMap<>();
        }
    }

}
